package com.curator.install;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.curator.util.ConfigUtil;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author Jun
 * @date 2024/12/7 
 */
public class InstallLayout {

    private static final Logger logger = LoggerFactory.getLogger(InstallLayout.class);

    /**
     * init安装选项卡
     *
     * @param primaryStage 主窗口
     * @return {@link Tab }
     */
    public static Tab initInstallTab(Stage primaryStage) {
        Tab installTab = new Tab("安装");

        // 创建一个 下划线
        Separator separator = new Separator();
        separator.setPadding(new Insets(0, 0, 10, 0));

        // 安装提示
        Label label = new Label("将安装Redis、Mysql等软件到您的电脑，请确保磁盘空间及内存充足！");
        label.setWrapText(true);
        // 设置最小宽度，以确保文本能够换行
        label.setMinWidth(300);
        label.setPadding(new Insets(0, 0, 10, 0));

        // 安装位置
        VBox dirVbox = getDirVbox(primaryStage);
        dirVbox.setPadding(new Insets(0, 0, 10, 0));
        // 安装组件
        VBox componentVbox = getComponentVbox();
        componentVbox.setPadding(new Insets(0, 0, 10, 0));
        // 确认安装
        VBox confirmVbox = getConfirmVbox();

        VBox root = new VBox();
        root.getChildren().addAll(separator, label, dirVbox, componentVbox, confirmVbox);
        root.setPadding(new Insets(0, 20, 0, 20));

        installTab.setContent(root);

        return installTab;
    }


    /**
     * 安装位置 布局
     *
     * @param primaryStage 主窗口
     * @return {@link VBox }
     */
    private static VBox getDirVbox(Stage primaryStage) {
        Label tipLabel = new Label("1、安装位置");
        tipLabel.setPadding(new Insets(0, 0, 5, 0));
        tipLabel.getStyleClass().add("bold-label");

        //如果不存在d盘，取当前盘 盘符
        String drive = "D:\\";
        boolean existed = FileUtil.exist(drive);
        if (!existed) {
            drive = FileUtil.getTmpDir().getAbsolutePath().charAt(0) + ":\\";
        }
        TextField dirInput = new TextField(drive + "Program Files");
        InstallService.INSTALL_PATH = dirInput.getText();
        Button dirButton = getDirButton(primaryStage, dirInput);
        // 使 dirInput 自动扩展
        HBox.setHgrow(dirInput, Priority.ALWAYS);

        HBox locBox = new HBox(10);
        // 使 locBox 的宽度与 root 一致
        locBox.setPrefWidth(Double.MAX_VALUE);
        locBox.getChildren().addAll(dirInput, dirButton);

        VBox root = new VBox();
        root.getChildren().addAll(tipLabel, locBox);
        root.setPrefWidth(Double.MAX_VALUE);

        return root;
    }

    /**
     * 获取组件 布局
     *
     * @return {@link VBox }
     */
    private static VBox getComponentVbox() {
        Label tipLabel = new Label("2、安装组件");
        tipLabel.setPadding(new Insets(0, 0, 5, 0));
        tipLabel.getStyleClass().add("bold-label");

        // 创建多选框
        JSONObject componentConfig = ConfigUtil.readComponentConfig();
        List<CheckBox> checkBoxList = new ArrayList<>();
        for (Map.Entry<String, Object> entry : componentConfig.entrySet()) {
            String key = entry.getKey();
            String name = entry.getValue().toString();

            CheckBox checkBox = new CheckBox(name);
            checkBox.getStyleClass().add("round-checkbox");
            checkBox.selectedProperty().addListener((observable, oldValue, newValue) -> {
                logger.info("{}选中状态已更改为: {}", key, newValue);
                InstallService.INSTALL_COMPONENT.set(key, newValue);
            });
            checkBoxList.add(checkBox);
        }

        // 创建一个新的 VBox 来包含多选框
        VBox checkBoxesBox = new VBox(10);
        checkBoxesBox.getChildren().addAll(checkBoxList);
        checkBoxesBox.setStyle("-fx-border-color: black; -fx-border-width: 0.5;");
        checkBoxesBox.setPadding(new Insets(10, 10, 10, 10));
        checkBoxesBox.setPrefHeight(250);
        checkBoxesBox.setOnMouseClicked(e -> checkBoxesBox.requestFocus());

        // 滚动布局
        ScrollPane scrollPane = new ScrollPane(checkBoxesBox);
        scrollPane.setFitToWidth(true);
        scrollPane.setFitToHeight(true);
        scrollPane.setFocusTraversable(false);

        VBox root = new VBox();
        root.getChildren().addAll(tipLabel, scrollPane);
        root.setPrefWidth(Double.MAX_VALUE);


        return root;
    }

    /**
     * 获取确认、取消 布局
     *
     * @return {@link VBox }
     */
    private static VBox getConfirmVbox() {
        String labelText = "当前选择的组件至少需要{}的磁盘空间";
        labelText = StrUtil.format(labelText, "10GB");
        Label tipLabel = new Label(labelText);
        tipLabel.setPadding(new Insets(0, 0, 8, 0));
        tipLabel.getStyleClass().add("bold-label");

        Button confirmButton = new Button("确认");
        confirmButton.setOnAction(event -> {
            InstallService.install();
        });
        confirmButton.getStyleClass().add("confirm-button");
        confirmButton.setPrefWidth(100);

        Button cancelButton = new Button("取消");
        cancelButton.setOnAction(event -> {
            logger.info("取消按钮被点击");
        });
        cancelButton.getStyleClass().add("cancel-button");
        cancelButton.setPrefWidth(100);

        HBox hBox = new HBox(15);
        hBox.setAlignment(Pos.CENTER);
        hBox.getChildren().addAll(confirmButton, cancelButton);

        VBox root = new VBox();
        root.getChildren().addAll(tipLabel, hBox);
        root.setPrefWidth(Double.MAX_VALUE);
        return root;
    }

    /**
     * 选择文件夹 按钮
     *
     * @param primaryStage 主窗口
     * @param dirInput 文件夹地址
     * @return {@link Button }
     */
    private static Button getDirButton(Stage primaryStage, TextField dirInput) {
        Button dirButton = new Button("选择文件夹");
        dirButton.setOnAction(event -> {
            DirectoryChooser directoryChooser = new DirectoryChooser();
            File selectedDirectory = directoryChooser.showDialog(primaryStage);
            if (selectedDirectory != null) {
                // 可以在这里处理选择的文件夹路径
                String path = selectedDirectory.getAbsolutePath();
                System.out.println("安装路径选择: " + path);
                dirInput.setText(path);
                InstallService.INSTALL_PATH = path;
            }
        });
        dirButton.getStyleClass().add("dir-button");
        return dirButton;
    }
}
